/*
 * GestorToken.h
 *
 *  Created on: Dec 16, 2013
 *      Author: m
 */

#ifndef GESTORTOKEN_H_
#define GESTORTOKEN_H_

#include "DSMComun.h"
#include "SharedMemory2.h"
#include "MessageQueue.h"
#include "ColaRemotaTransmisor.h"
#include "ColaRemotaReceptor.h"
#include "CPrinter.h"
#include "StringUtils.h"

using ipc::MessageQueue;
using ipc::CPrinter;
using ipc::SharedMemory2;

template<class T>
class GestorToken
{
protected:
    int m_tokenID;
    T m_valorInicial;

public:
    GestorToken( int tokenID ) :
        m_tokenID( tokenID )
    {
    }

    virtual ~GestorToken()
    {
    }

    void inicializarToken( T valorInicial )
    {
        m_valorInicial = valorInicial;
    }

    void run()
    {
        MessageQueue<TokenDSM> colaEntradaToken =
                MessageQueue<TokenDSM>::get( DSM_IPC_BASEFILE, COLA_ENTREGA_TOKEN );
        MessageQueue<TokenDSM> colaSalidaToken =
                MessageQueue<TokenDSM>::get( DSM_IPC_BASEFILE, COLA_LIBERAR_TOKEN );

        CPrinter::setHeader( "dsmGestorToken", m_tokenID );

        TokenDSM token;
        token.idDSM = m_tokenID;
        memcpy( token.data, &m_valorInicial, sizeof(T) );

        while ( true )
        {
            // Simulo la llegada del token desde el anillo
            int sleepTime = random() % 2;

            CPrinter::printOut( "Esperando el token: %ds", sleepTime );
            sleep( sleepTime );

            CPrinter::printOut( "Llego el token %d desde el anillo", token.idDSM );
            CPrinter::printOut( "Enviando el token a los agentes" );
            colaEntradaToken.put( m_tokenID, token );
            token = colaSalidaToken.get( m_tokenID );
            CPrinter::printOut( "Devolviendo el token al anillo" );
        }
    }
};

#endif /* GESTORTOKEN_H_ */
